[따배도] - 컨테이너 볼륨 스토리지


컨테이너 볼륨 명령어와 볼륨 공유를 통해 컨테이너에서 사용하는 방법을 배워봅시다.

컨테이너 볼륨이란?

  • 실행중인 컨테이너에 있는 데이터는 컨테이너가 종료되는 즉시 데이터가 삭제되므로, 중요 데이터는 별도로 보관할 필요성이 있습니다.
  • 컨테이너 이미지는 기본적으로 ReadOnly로 수정이 불가합니다.
  • 컨테이너에 추가되는 데이터들은 별도의 RW 레이어에 저장됩니다.

    • 컨테이너를 실행시킬 때(프로세스로 동작중) RW 레이어가 실행되고, 모든 데이터는 RW 레이어에 저장됩니다.
    • 이것을 Union File System 또는 Overlay라고 불립니다.

데이터를 영구적으로 보존하는 방법

  • -v 옵션을 통해서 볼륨을 <호스트 path>:<컨테이너 path> 형태로 만들 수 있습니다.

    • 컨테이너 안에 쌓인 데이터를 호스트 path로 지정해서 데이터를 쌓을 수 있습니다.
  • MySQL 이미지를 이용한 명령어 예시
$ docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=pass mysql:latest

이외에 다른 명령 옵션

  • -v <호스트 path>:<컨테이너 path>:<read write mode> : ReadOnly 등의 옵션을 지정할 수 있습니다.

    • ro 옵션을 부여하게 되면, 컨테이너 안에서 데이터 수정 불가능
  • -v <컨테이너 path> : 자동으로 /var/lib/docker/volumes/uuid/\data_ 폴더에 데이터가 보존됩니다.

컨테이너끼리 데이터 공유하기

  • 컨테이너를 운용하면서 쌓인 데이터를 해당 컨테이너에서만 사용하는 것이 아니라, 다른 컨테이너에서 데이터의 사용이 필요할 때 사용할 수 있습니다.

예시

  • 아래 예시는 df라는 이름을 가진 컨테이너가 /webdata 디렉토리에 데이터를 저장시켜 주고,
  • 우분투 이미지를 사용하는 컨테이너가 해당 디렉토리의 데이터를 가져와 readonly로 사용중인 것을 의미합니다.
# df라는 이름의 컨테이너 생성 후 /webdata에 데이터를 볼륨 마운트
$ docker run -v /webdata:/webdata -d --name df swjoolinux/df:latest
# 우분투 이미지를 사용하는 컨테이너에서 /webdata에 쌓인 데이터를 ro(readonly)로 사용
$ docker run -d -v /webdata:/usr/share/nginx/html:ro ubuntu:latest

실습

MySQL 컨테이너 이미지를 통한 data 영구 보존하기

  • 도커 이미지를 실행 및 /dbdata에 저장하기

    • /dbdata 디렉토리가 별도로 생성되어 있지 않아도 해당 디렉토리가 없다면 자동 생성됩니다.
$ docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass mysql:latest
  • 컨테이너 안에 접속하기
$ docker exec -it db /bin/bash
  • 컨테이너 안에 있는 MySQL 접속
$ mysql -u root -ppass
# mysql
# 데이터베이스 확인
show databases;
# swjoo - database 만들기
create database swjoo;
exit # mysql out
exit # 컨테이너 out
  • 호스트 PC 안에 볼륨 확인
$ cd /dbdata/
$ ls
# swjoo 폴더가 생성되어 있음을 확인
  • 컨테이너 삭제해도 데이터베이스가 남아있는지 확인하기
$ docker rm -f db
$ cd /dbdata

별첨 - 호스트 path 생략

  • 호스트 path 생략 시 /var/lib/docker/volumes/UUID(고유이름-inspect로 확인가능)/_data 폴더에 데이터가 생성됩니다.
$ docker run -d --name db -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass mysql:latest

볼륨과 관련된 커맨드

  • 도커 볼륨을 사용하고 있는 목록 확인하기
$ docker volume ls
  • 도커 볼륨 삭제하기
$ docker volume rm 볼륨 아이디

실습2 - 웹데이터를 컨테이너에 지원하기

  • 데이터 디렉토리 생성 및 데이터 입력
$ mkdir /webdata && cd /webdata
$ echo "<h1>youtube swjoo</h1>" > index.html
  • 볼륨을 이용한 nginx 컨테이너 실행 및 curl 명령어로 검증

    • /usr/share/nginx/html:ro : nginx의 루트 디렉토리 경로(ro는 ReadOnly 옵션)
$ docker run -d --name web -v /webdata:/usr/share/nginx/html:ro -p 80:80 nginx:latest
$ curl localhost:80
💡

df 명령어

  • 디스크 사용량을 모니터링 할 때 사용
  • root 파일시스템 사용량 확인 명령어
$ df -h /

실습3 - 컨테이너끼리 데이터 공유하기

  • 쉘 스크립트 생성

    • 컨테이너에 사용할 데이터 생성
$ cat df.sh
#!/bin/bash
mkdir -p /webdata
while true
do
  df -h / > /webdata/index.html # root의 파일시스템 모니터링 데이터를 생성 후, 리다이렉트
  sleep 10
done
  • df.sh 스크립트를 통해 데이터를 만들어내는 이미지를 생성하기 위한 dockerfile 파일 생성
$ cat dockerfile
FROM ubuntu:18.04
ADD df.sh /bin/df.sh
RUN chmod +x /bin/df.sh
ENTRYPOINT ["/bin/df.sh"]
  • dockerfile 이미지 빌드
$ docker build -t alskadmlcraz/df:latest .
  • /webdata 폴더에 데이터를 쌓는 컨테이너 실행
$ docker run -v /webdata:/webdata -d alskadmlcraz/df:latest
  • /webdata의 데이터를 이용하는 nginx 컨테이너 실행 및 검증
$ docker run -d --name web -v /webdata:/usr/share/nginx/html:ro -p 80:80 nginx:latest
$ curl localhost:80
# 아래 다수의 데이터가 쌓여 있는 것을 확인할 수 있음
Filesystem      Size  Used Avail Use% Mounted on
overlay          17G  4.9G   11G  31% /
Filesystem      Size  Used Avail Use% Mounted on
overlay          17G  4.9G   11G  31% /
Filesystem      Size  Used Avail Use% Mounted on
overlay          17G  4.9G   11G  31% /
Filesystem      Size  Used Avail Use% Mounted on
overlay          17G  4.9G   11G  31% /
Filesystem      Size  Used Avail Use% Mounted on
overlay          17G  4.9G   11G  31% /
Filesystem      Size  Used Avail Use% Mounted on
overlay          17G  4.9G   11G  31% /
Filesystem      Size  Used Avail Use% Mounted on
overlay          17G  4.9G   11G  31% /
Filesystem      Size  Used Avail Use% Mounted on
overlay          17G  4.9G   11G  31% /
...
  • 모든 자원 삭제
$ docker system prune

Hello, I'm@nickhealthy
개발자를 꿈꾸고, 파이썬과 클라우드에 관심이 많은 비전공자

Github